package com.itany.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/11/11 14:08
 * Version:1.0-SNAPSHOT
 * Description: 保存返回主键
 */
public class Test06 {

    public static void main(String[] args) {
        User user = new User("花木兰","123456","15812345678","王者荣耀");
        Integer id = insertReturnPrimaryKey(user);
        System.out.println("返回的主键值为:"+id);
    }

    public static Integer insertReturnPrimaryKey(User user){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Integer id = null;
        try {
            conn = JDBCUtil.getConnection();
            String sql = new StringBuffer()
                    .append(" insert into ")
                    .append(" t_user ")
                    .append("   (username,password,phone,address) ")
                    .append(" values ")
                    .append("   (?,?,?,?)")
                    .toString();
            // 在获取状态集的时候,设置保存返回主键
            // 第二个参数即用于设置是否返回主键
            // 其值是PreparedStatement的父类Statement提供的两个常量之一
            // RETURN_GENERATED_KEYS:保存后返回生成的主键值
            // NO_GENERATED_KEYS:保存后不返回主键值
            ps = conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
            ps.setString(1,user.getUsername());
            ps.setString(2,user.getPassword());
            ps.setString(3,user.getPhone());
            ps.setString(4,user.getAddress());
            // 由于自动生成的主键是在执行完保存操作之后才会生成
            // 因此,需要先保存
            ps.executeUpdate();
            // 获取到生成的主键的值
            rs = ps.getGeneratedKeys();
            while (rs.next()){
                // 由于生成的主键是由数据库自动生成的
                // 对于开发者而言,数据库厂商为返回的字段设置的名字我们不知道
                // 但是开发者知道,此时一定有且仅有一个主键
                // 可以通过索引号查找,索引号从1开始
                // 将结果集第一列的数据映射给id
                id = rs.getInt(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(conn,ps,rs);
        }
        return id;
    }

}
